#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#pragma pack(4)//默认对齐数改为4
#pragma pack()//恢复默认对齐数
#pragma pack(1)//等价于不对齐
//结构体内存对齐
//1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
//2. 其他成员变量要对⻬到某个数字（对⻬数）的整数倍的地址处。
//对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。
//- VS 中默认的值为 8
//- Linux中 gcc 没有默认对⻬数，对⻬数就是成员⾃⾝的⼤⼩
//3. 结构体总⼤⼩为最⼤对⻬数（结构体中每个成员变量都有⼀个对⻬数，所有对⻬数中最⼤的）的
//整数倍。
//4. 如果嵌套了结构体的情况，嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处，结构
//体的整体⼤⼩就是所有最⼤对⻬数（含嵌套结构体中成员的对⻬数）的整数倍。


struct S1//12
{
    char c1;//，对其数为1，偏移量为0
    int i;//对齐数为4，偏移量为4
    char c2;//对齐数为1，偏移量为8
    //最大对其数为4，总大小为12
};

struct S2//8
{
    char c1;
    char c2;
    int i;
};

struct S3//16
{
    double d;
    char c;
    int i;
};

struct S4//32
{
    char c1;
    struct S3 s3;
    double d;
};

int main()
{
    //printf("%d\n", sizeof(struct S1));//12
    //printf("%d\n", sizeof(struct S2));//8
    printf("%d ", sizeof(struct S3));
    printf("%d ", sizeof(struct S4));
    printf("\n");
    //offsetof();//返回成员在结构体中的偏移量
    printf("%d ", offsetof(struct S1, c1));
    printf("%d ", offsetof(struct S1, i));
    printf("%d ", offsetof(struct S1, c2));

    printf("\n");

    printf("%d ", offsetof(struct S2, c1));
    printf("%d ", offsetof(struct S2, c2));
    printf("%d ", offsetof(struct S2, i));

    return 0;
}